#ifndef INTENSITYTRAFFIC_H
#define INTENSITYTRAFFIC_H

#include <QWidget>
#include <QMap>
class QLabel;
class QSpinBox;
class QGroupBox;
class QVBoxLayout;
class QLine;
class QPushButton;
class QCheckBox;
class QGridLayout;
class QCheckBox;
class QLayout;
class QSpacerItem;
class QHBoxLayout;

/*! \class IntensityTraffic
    \brief Klasa - widget opcji natężenia samochodów na gałęziach.

    Widget IntensityTraffic zajmuje całą przestrzeń lewego panelu.
    Umożliwia ustawianie opcji natężenia częstości generowania samochodów
    na poszczególnych wjazdach oraz którymi gałęziami samochody powinny zjeżdżać z ronda.
    Natężenia ustawia się w następujący sposób:
    Dla każdego wjazdu można ustawić natężenie generowania samochodów oraz procentowy rozkład,
    którymi gałęziami mają zjeżdżać smochody z ronda dla tego wjazdu.
    Funkcja checkProcent() pilnuje, aby procentowa suma zjeżdżjących z ronda była zawsze równa 100.
    Aby zapisać dokonane zmiany w natężeniu należy użyć przycisku "Zapisz zmiany".
*/
class IntensityTraffic : public QWidget
{
    Q_OBJECT
public:
    IntensityTraffic();
    void populateMe(QString name = "RoundaboutSimulator");
    void destroyLeftOptions();
    void saveIntensitySettings(QString name = "RoundaboutSimulator");
    void readIntensitySettings(QString name = "RoundaboutSimulator");
    void changeLeftOptions(QString name = "RoundaboutSimulator");
    void trafficChanged(QString name = "RoundaboutSimulator");

    QPushButton *getCmdApply();

public slots:
    void checkProcent(QString name = "RoundaboutSimulator");
    void paintTextButtonRedSlot(int atrapa);
    void blockSpinBox(bool);

private:
    QGroupBox **_wjazdyGroupBox; /*!< Grupa tworzona dla każdego wjazdu o nazwie odpowiadającej numerowi wjazdu.
                                    Logicznie zawiera w sobie widgety ustawiające natężenie wjazdów i wyjazdów oraz QCheckBox.
                                    Fizycznie ma ustawiony layout _layoutGroup do którego dopiero te widgety są dokładane.
                                    Sam QGroupBox jest umieszczony na layoucie _glownyLayout. */

    QGridLayout **_layoutGroup; /*!< Layout wewnątrz _wjazdyGroupBox. Zatem liczba _layoutGroup i _wjazdyGroupBox jest identyczna
                                     i równa liczbie wjazdów. Na tym layoucie umieszczone są widgety: _natezenieWjazdowLabel, _wjazdySpinBox,
                                     _wyjazdyLabel, _wyjazdySpinBox, _checkBoxExitList. */

    QSpinBox ***_wyjazdySpinBox;/*! Dwuwymiarow tablica wskaźników: i to liczba wjazdow, j - liczba wyjazdów. Ponieważ potrzebny jest i*j liczba SpinBoxów.
                                    Każdy ze SpinBoxów przedstawia natężenie zjazdu samochodu na daną gałąź w zależności od numeruu wjazdu.*/
    QLabel ***_wyjazdyLabel; /*!< Etykiety numeru zjazdu. Podobnie jak w przypadku _wyjazdySpinBox jest to dwuwymiarowa tablica wskaźników. Liczba etykiet wyjazdów jest identyczna z liczbą _wyjazdySpinBox */

    QLabel **_natezenieWjazdowLabel; /*!< Etykiety numerów wjazdów na rondo. Liczba etykiet równa liczbie wjazdów.*/
    QSpinBox **_wjazdySpinBox; /*!< Natężenie częstości generowania samochodów na wjeździe. */

    QHBoxLayout *_zatwierdzLayout; /*!< Layout do przycisku _zatwierdz. */
    QGridLayout *_glownyLayout; /*!< Główny layout w postaci siatki. Do niego dołączone są _wjazdyGroupBox.*/
    QSpacerItem* _opcjeSpacer; /*!< */
    QPushButton *_zatwierdz; /*!< Przycisk "zapisz zmiany". Jego kliknięcie wysyła sygnał, który jest odbierany przez slot checkProcent().
                                Czcionka przycisku zmienia kolor na czerwony, gdy wprowadzone zmiany natężeń nie zostały jeszcze zapisane.*/

    QList< QList< QCheckBox* >* > *_checkBoxExitList; /*!< lista checkBoxów blokujących możliwość zmiany wartości natężenia w odpowiadającym _wyjazdySpinBox */
    int ileWjazdow; /*!< Liczba wjazdów na rondzie. Zmienna obliczana  w funkcji countBranches().*/
    QList <int> numeryWjazdow; /*!< Numery gałęzi odpowiadające kolejnym wjazdom */
    int ileWyjazdow; /*!< Liczba wyjazdów na rondzie. Zmienna obliczana  w funkcji countBranches().*/
    QList <int> numeryWyjazdow; /*!< Numery gałęzi odpowiadające kolejnym wyjazdom */

    void countBranches(QString name = "RoundaboutSimulator"); // odczytuje z zapisanych opcji liczbę wjazdów i zjazdów.
    QList <bool> uncheckAll(int );
    void checkFromList(int, QList <bool>);

signals:
    void newTrafficSettings(); /*!< Sygnał jest wysyłany gdy ustawienia się zmieniły i zostały zapisane (został kliknięty przycisk "Zapisz zmiany") */

};

#endif // INTENSITYTRAFFIC_H
